﻿using CLM.Gestao.Interfaces;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace CLM.Gestao.Administrador.UI
{
    public partial class PerfisAcesso : Form, IFormulario
    {
        #region Propriedades e Variáveis

        BLL.PerfilAcesso PerfilAcesso = new BLL.PerfilAcesso();

        //Lista para armazenar os objetos apresentados na interface
        List<BLL.PerfilAcesso.Lista> ListaPerfisAcesso;

        //Objeto utilizado para armazenas os valores novos ou de alteração de um registro
        BLL.PerfilAcesso.Lista PerfilAcessoSelecionado = null;

        //Objeto utilizado para filtros
        BLL.PerfilAcesso.Lista PerfilAcessoFiltro = null;

        //Objeto para controle do Estado da interface
        Util.Estado Estado = Util.Estado.Nenhum;

        #endregion

        #region Construtor

        public PerfisAcesso()
        {
            try
            {
                InitializeComponent();
                var pos = this.PointToScreen(lblTitulo.Location);
                pos = picTitulo.PointToClient(pos);
                lblTitulo.Parent = picTitulo;
                lblTitulo.Location = pos;
                lblTitulo.BackColor = Color.Transparent;

                InicializaGrid();
                InicializaCombos();
                ConfiguraInterface(Util.Estado.Nenhum);
                Limpar();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        #endregion Contrutor

        #region Eventos

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            try
            {
                PerfilAcessoFiltro = null;
                Buscar();
                ConfiguraInterface(Util.Estado.Consulta);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnIncluir_Click(object sender, EventArgs e)
        {
            try
            {
                PerfilAcessoSelecionado = new BLL.PerfilAcesso.Lista();
                ConfiguraInterface(Util.Estado.Inclusao);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnSalvar_Click(object sender, EventArgs e)
        {
            try
            {
                ValidarInterface();
                AtualizaObjeto();
                Salvar();

                if (dgvPerfisAcesso.DataSource == null)
                    CarregaObjetoFiltro();

                Cancelar();
                Buscar();

                ConfiguraInterface(Util.Estado.Nenhum);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            try
            {
                Cancelar();
                ConfiguraInterface(Util.Estado.Nenhum);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnExcluir_Click(object sender, EventArgs e)
        {
            try
            {
                if (MessageBox.Show("Tem certeza que deseja excluir o perfil de acesso?", "Atenção", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
                {
                    Excluir();
                    Cancelar();
                    Buscar();

                    ConfiguraInterface(Util.Estado.Nenhum);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnLimpar_Click(object sender, EventArgs e)
        {
            try
            {
                Limpar();
                ConfiguraInterface(Util.Estado.Nenhum);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

        private void btnExportar_Click(object sender, EventArgs e)
        {
            try
            {
                Exportar();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void dgvPerfisAcesso_DoubleClick(object sender, EventArgs e)
        {
            try
            {
                PerfilAcessoSelecionado = ListaPerfisAcesso[dgvPerfisAcesso.SelectedRows[0].Index];
                AtualizaInterface();
                ConfiguraInterface(Util.Estado.Alteracao);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

        #endregion Eventos

        #region Métodos Públicos

        public void CarregaObjetoFiltro()
        {
            PerfilAcessoFiltro = new BLL.PerfilAcesso.Lista();
            if (!string.IsNullOrWhiteSpace(txtNomePerfilAcesso.Text)) PerfilAcessoFiltro.NomePerfilAcesso = txtNomePerfilAcesso.Text;
        }

        public void InicializaCombos()
        {
        }

        public void InicializaGrid()
        {
            dgvPerfisAcesso.AutoGenerateColumns = false;
            dgvPerfisAcesso.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            dgvPerfisAcesso.Columns.Add(new DataGridViewColumn() { DataPropertyName = "NomePerfilAcesso", HeaderText = "Nome", CellTemplate = new DataGridViewTextBoxCell() });
        }

        public void ValidarInterface()
        {
            if (string.IsNullOrWhiteSpace(txtNomePerfilAcesso.Text)) throw new Exception("O nome é obrigatório.");
        }

        public void AtualizaObjeto()
        {
            PerfilAcessoSelecionado.NomePerfilAcesso = txtNomePerfilAcesso.Text;
            PerfilAcessoSelecionado.AlocacaoDespesas = chkAlocacaoDespesas.Checked;
            PerfilAcessoSelecionado.CalcularRateioProduto = chkCalcularRateioProduto.Checked;
            PerfilAcessoSelecionado.ExportarCustosDespesas = chkExportarCustosDespesas.Checked;
            PerfilAcessoSelecionado.ExportarVendas = chkExportarVendas.Checked;
            PerfilAcessoSelecionado.IdPerfilAcesso = PerfilAcessoSelecionado.IdPerfilAcesso;
            PerfilAcessoSelecionado.ImportacaoCusto = chkImportacaoCusto.Checked;
            PerfilAcessoSelecionado.ImportacaoProdutoGlobal = chkImportacaoProdutoGlobal.Checked;
            PerfilAcessoSelecionado.ImportacaoProvisoesDevolucao = chkImportacaoProvisoesDevolucao.Checked;
            PerfilAcessoSelecionado.ImportaCustoUnitarioAmostra = chkImportaCustoUnitarioAmostra.Checked;
            PerfilAcessoSelecionado.ImportaCustoUnitarioProduto = chkImportaCustoUnitarioProduto.Checked;
            PerfilAcessoSelecionado.ImportarPromocaoGrade = chkImportarPromocaoGrade.Checked;
            PerfilAcessoSelecionado.ImportarRateioGGF = chkImportarRateioGGF.Checked;
            PerfilAcessoSelecionado.ManutencaoCentroCusto = chkManutencaoCentroCusto.Checked;
            PerfilAcessoSelecionado.ManutencaoContaContabil = chkManutencaoContaContabil.Checked;
            PerfilAcessoSelecionado.ManutencaoPerfilAcesso = chkManutencaoPerfilAcesso.Checked;
            PerfilAcessoSelecionado.ManutencaoPeriodo = chkManutencaoPeriodo.Checked;
            PerfilAcessoSelecionado.ManutencaoProdutos = chkManutencaoProdutos.Checked;
            PerfilAcessoSelecionado.ManutencaoUsuario = chkManutencaoUsuario.Checked;
            PerfilAcessoSelecionado.PremissasCalculoCusto = chkPremissasCalculoCusto.Checked;
            PerfilAcessoSelecionado.RelatorioDivergenciaProdutos = chkRelatorioDivergenciaProdutos.Checked;
            PerfilAcessoSelecionado.RelatorioIndicadoresDespesas = chkRelatorioIndicadoresDespesas.Checked;
            PerfilAcessoSelecionado.RelatorioIndicadoresVenda = chkRelatorioIndicadoresVenda.Checked;
            PerfilAcessoSelecionado.SincronizaCentroCusto = chkSincronizaCentroCusto.Checked;
            PerfilAcessoSelecionado.SincronizaContaContabil = chkSincronizaContaContabil.Checked;
            PerfilAcessoSelecionado.SincronizaProdutos = chkSincronizaProdutos.Checked;
            PerfilAcessoSelecionado.SincronizarDespesasRealizadas = chkSincronizarDespesasRealizadas.Checked;
            PerfilAcessoSelecionado.SincronizaVendaRealizada = chkSincronizaVendaRealizada.Checked;
            PerfilAcessoSelecionado.VisualizarPNL = chkVisualizarPNL.Checked;
        }

        public void AtualizaInterface()
        {
            txtNomePerfilAcesso.Text = PerfilAcessoSelecionado.NomePerfilAcesso;
            chkAlocacaoDespesas.Checked = (bool)PerfilAcessoSelecionado.AlocacaoDespesas;
            chkCalcularRateioProduto.Checked = (bool)PerfilAcessoSelecionado.CalcularRateioProduto;
            chkExportarCustosDespesas.Checked = (bool)PerfilAcessoSelecionado.ExportarCustosDespesas;
            chkExportarVendas.Checked = (bool)PerfilAcessoSelecionado.ExportarVendas;
            chkImportacaoCusto.Checked = (bool)PerfilAcessoSelecionado.ImportacaoCusto;
            chkImportacaoProdutoGlobal.Checked = (bool)PerfilAcessoSelecionado.ImportacaoProdutoGlobal;
            chkImportacaoProvisoesDevolucao.Checked = (bool)PerfilAcessoSelecionado.ImportacaoProvisoesDevolucao;
            chkImportaCustoUnitarioAmostra.Checked = (bool)PerfilAcessoSelecionado.ImportaCustoUnitarioAmostra;
            chkImportaCustoUnitarioProduto.Checked = (bool)PerfilAcessoSelecionado.ImportaCustoUnitarioProduto;
            chkImportarPromocaoGrade.Checked = (bool)PerfilAcessoSelecionado.ImportarPromocaoGrade;
            chkImportarRateioGGF.Checked = (bool)PerfilAcessoSelecionado.ImportarRateioGGF;
            chkManutencaoCentroCusto.Checked = (bool)PerfilAcessoSelecionado.ManutencaoCentroCusto;
            chkManutencaoContaContabil.Checked = (bool)PerfilAcessoSelecionado.ManutencaoContaContabil;
            chkManutencaoPerfilAcesso.Checked = (bool)PerfilAcessoSelecionado.ManutencaoPerfilAcesso;
            chkManutencaoPeriodo.Checked = (bool)PerfilAcessoSelecionado.ManutencaoPeriodo;
            chkManutencaoProdutos.Checked = (bool)PerfilAcessoSelecionado.ManutencaoProdutos;
            chkManutencaoUsuario.Checked = (bool)PerfilAcessoSelecionado.ManutencaoUsuario;
            chkPremissasCalculoCusto.Checked = (bool)PerfilAcessoSelecionado.PremissasCalculoCusto;
            chkRelatorioDivergenciaProdutos.Checked = (bool)PerfilAcessoSelecionado.RelatorioDivergenciaProdutos;
            chkRelatorioIndicadoresDespesas.Checked = (bool)PerfilAcessoSelecionado.RelatorioIndicadoresDespesas;
            chkRelatorioIndicadoresVenda.Checked = (bool)PerfilAcessoSelecionado.RelatorioIndicadoresVenda;
            chkSincronizaCentroCusto.Checked = (bool)PerfilAcessoSelecionado.SincronizaCentroCusto;
            chkSincronizaContaContabil.Checked = (bool)PerfilAcessoSelecionado.SincronizaContaContabil;
            chkSincronizaProdutos.Checked = (bool)PerfilAcessoSelecionado.SincronizaProdutos;
            chkSincronizarDespesasRealizadas.Checked = (bool)PerfilAcessoSelecionado.SincronizarDespesasRealizadas;
            chkSincronizaVendaRealizada.Checked = (bool)PerfilAcessoSelecionado.SincronizaVendaRealizada;
            chkVisualizarPNL.Checked = (bool)PerfilAcessoSelecionado.VisualizarPNL;
        }

        public void Incluir()
        {
            PerfilAcesso.Add(new List<BLL.PerfilAcesso.Lista>() { PerfilAcessoSelecionado });
            MessageBox.Show("Perfil de acesso cadastrado com sucesso.");
        }

        public void Alterar()
        {
            PerfilAcesso.Update(new List<BLL.PerfilAcesso.Lista>() { PerfilAcessoSelecionado });
            MessageBox.Show("Perfil de acesso alterado com sucesso.");
        }

        public void Excluir()
        {
            PerfilAcesso.Delete(new List<BLL.PerfilAcesso.Lista>() { PerfilAcessoSelecionado });
            MessageBox.Show("Perfil de acesso excluído com sucesso.");
        }

        public void Cancelar()
        {
            txtNomePerfilAcesso.Text = string.Empty;
            chkAlocacaoDespesas.Checked = false;
            chkCalcularRateioProduto.Checked = false;
            chkExportarCustosDespesas.Checked = false;
            chkExportarVendas.Checked = false;
            chkImportacaoCusto.Checked = false;
            chkImportacaoProdutoGlobal.Checked = false;
            chkImportacaoProvisoesDevolucao.Checked = false;
            chkImportaCustoUnitarioAmostra.Checked = false;
            chkImportaCustoUnitarioProduto.Checked = false;
            chkImportarPromocaoGrade.Checked = false;
            chkImportarRateioGGF.Checked = false;
            chkManutencaoCentroCusto.Checked = false;
            chkManutencaoContaContabil.Checked = false;
            chkManutencaoPerfilAcesso.Checked = false;
            chkManutencaoPeriodo.Checked = false;
            chkManutencaoProdutos.Checked = false;
            chkManutencaoUsuario.Checked = false;
            chkPremissasCalculoCusto.Checked = false;
            chkRelatorioDivergenciaProdutos.Checked = false;
            chkRelatorioIndicadoresDespesas.Checked = false;
            chkRelatorioIndicadoresVenda.Checked = false;
            chkSincronizaCentroCusto.Checked = false;
            chkSincronizaContaContabil.Checked = false;
            chkSincronizaProdutos.Checked = false;
            chkSincronizarDespesasRealizadas.Checked = false;
            chkSincronizaVendaRealizada.Checked = false;
            chkVisualizarPNL.Checked = false;
        }

        public void Salvar()
        {
            switch (Estado)
            {
                case Util.Estado.Nenhum:
                    break;
                case Util.Estado.Inclusao:
                    Incluir();
                    break;
                case Util.Estado.Alteracao:
                    Alterar();
                    break;
                default:
                    break;
            }
        }

        public void Limpar()
        {
            Cancelar();
            PerfilAcessoFiltro = null;
            dgvPerfisAcesso.DataSource = null;
        }

        public void Buscar()
        {
            if (PerfilAcessoFiltro == null) CarregaObjetoFiltro();
            ListaPerfisAcesso = PerfilAcesso.GetLista(PerfilAcessoFiltro);
            dgvPerfisAcesso.DataSource = ListaPerfisAcesso;

            dgvPerfisAcesso.ClearSelection();
        }

        public void ConfiguraInterface(Util.Estado pEstado)
        {
            Estado = pEstado;

            if (pEstado == Util.Estado.Inclusao)
                dgvPerfisAcesso.ClearSelection();

            btnIncluir.Enabled = (Estado == Util.Estado.Nenhum ||
                                 Estado == Util.Estado.Consulta) ? true : false;

            btnSalvar.Enabled = (Estado == Util.Estado.Alteracao ||
                                 Estado == Util.Estado.Inclusao) ? true : false;

            btnCancelar.Enabled = (Estado == Util.Estado.Alteracao ||
                                 Estado == Util.Estado.Inclusao) ? true : false;

            btnExcluir.Enabled = (Estado == Util.Estado.Alteracao) ? true : false;

            btnBuscar.Enabled = (Estado == Util.Estado.Nenhum ||
                                 Estado == Util.Estado.Consulta) ? true : false;

            btnLimpar.Enabled = (dgvPerfisAcesso.DataSource != null) ? true : false;

            btnExportar.Enabled = (dgvPerfisAcesso.DataSource != null) ? true : false;

            dgvPerfisAcesso.Enabled = (Estado == Util.Estado.Consulta ||
                                 (Estado == Util.Estado.Nenhum && dgvPerfisAcesso.DataSource != null)) ? true : false;
        }

        public void Exportar()
        {
            string FileName = string.Empty;

            SaveFileDialog sfdExportar = new SaveFileDialog();
            sfdExportar.Filter = "Arquivo Excel 2007-2010|*.xlsx|Arquivo Excel 97-2003|*.xls";
            sfdExportar.Title = "Salvar Arquivo";
            sfdExportar.FileName = "";
            if (sfdExportar.ShowDialog() == DialogResult.OK)
            {
                FileName = sfdExportar.FileNames[0];

                string[] Cabecalho = { "Nome", "Usuários", "Perfis de Acesso", "Períodos", "Sincronizar Centros de Custo", "Manutenção Centros de Custo", 
                                       "Sincronizar Contas Contábeis", "Manutenção Contas Contábeis", "Sincronizar Produtos Nacionais", "Importar Produtos Globais", 
                                       "Manutenção de Produtos Nacionais", "Divergências entre Produtos Nacionais e Globais", "Importar Custo Unitário de Produto",
                                       "Importar Custo Unitário de Amostra","Sincronizar Vendas Realizadas","Importar Provisões de Devolução","Relatório de Indicadores de Venda",
                                       "Premissas de Cálculos de Custo","Importar Custos","Sincronizar Despesas Realizadas","Relatório de Indicadores de Despesas",
                                       "Alocação de Despesas MM RA","Importar Valores de Rateio GGF","Importar Valores de Promoção de Grade","Calcular Rateios de Produtos",
                                       "Visualizar PNL","Exportar Valores de Vendas","Exportar Valores de Custo e Despesas"};

                List<string> ListaCampos = new List<string> { "NomePerfilAcesso", "ManutencaoUsuario", "ManutencaoPerfilAcesso", "ManutencaoPeriodo", "SincronizaCentroCusto", 
                                       "ManutencaoCentroCusto", "SincronizaContaContabil", "ManutencaoContaContabil", "SincronizaProdutos", "ImportacaoProdutoGlobal", 
                                       "ManutencaoProdutos", "RelatorioDivergenciaProdutos", "ImportaCustoUnitarioProduto","ImportaCustoUnitarioAmostra",
                                       "SincronizaVendaRealizada","ImportacaoProvisoesDevolucao","RelatorioIndicadoresVenda","PremissasCalculoCusto","ImportacaoCusto",
                                       "SincronizarDespesasRealizadas","RelatorioIndicadoresDespesas","AlocacaoDespesas","ImportarRateioGGF","ImportarPromocaoGrade","CalcularRateioProduto",
                                       "VisualizarPNL","ExportarVendas","ExportarCustosDespesas"};

                Exportacao.Excel<BLL.PerfilAcesso.Lista>.TipoExportacao = Exportacao.TipoExportacao.Exportacao;
                Exportacao.Excel<BLL.PerfilAcesso.Lista>.Exportar(ListaPerfisAcesso, ListaCampos, Cabecalho, FileName, "Perfis de Acesso");
            }
        }

        #endregion Métodos Públicos
    }
}